// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程：https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
const db = uniCloud.database();
const cmd = db.command;
const db_car = db.collection('car');
const db_driver = db.collection('driver');
const db_duty_driver = db.collection('duty-driver');

module.exports = {
	_before: function() { // 通用预处理器

	},

	/**
	 * 获取所有符合条件的司机信息
	 * @param {object} event - 包含查询条件的对象
	 * @param {number} event.status - 司机的状态 (例如 0 表示空闲)
	 * @param {string} event.schedule_date - 需要查询的排班日期，格式 "YYYY-MM-DD"
	 */
	async getDriverInfoAll(event, content) {
		if (!event.schedule_date) {
			return [];
		}

		// 注意：这里的查询条件是 "data.date"，因为日期字段在嵌套的 data 对象中
		const dutySchedule = await db_duty_driver.where({
			"data.date": event.schedule_date
		}).limit(1).get();

		if (!dutySchedule.data || dutySchedule.data.length === 0) {
			console.log(`日期 ${event.schedule_date} 没有排班信息`);
			return [];
		}

		// 【修正点 1】: 修正了 groups 数组的访问路径
		// 从 dutySchedule.data[0].groups 改为 dutySchedule.data[0].data.groups
		const scheduleData = dutySchedule.data[0].data;
		const group4 = scheduleData.groups.find(g => g.groupType === 'group4');

		if (!group4 || !group4.members || group4.members.length === 0) {
			console.log(`日期 ${event.schedule_date} 的 group4 没有排班人员`);
			return [];
		}

		// 【修正点 2】: 修正了成员 ID 的提取方式
		// 从 member.id.$oid 改为 member.id，因为日志显示 id 是一个字符串
		const dutyDriverIds = group4.members.map(member => member.id);

		if (dutyDriverIds.length === 0) {
			return [];
		}

		const finalDriverList = await db_driver.where({
			_id: cmd.in(dutyDriverIds),
			status: event.status || 0 // 提供一个默认状态
		}).get();

		return finalDriverList.data;
	},

	/**
	 * [优化后] 根据ID获取单个司机信息
	 * @param {object} event - 包含司机ID的对象
	 * @param {string} event._id - 要查询的司机文档ID
	 * @returns {object|null} 返回找到的司机对象，或在未找到/参数错误时返回null
	 */
	async getDriverInfoById(event) {
		// 1. 参数校验：确保 _id 存在且有效
		if (!event || !event._id) {
			console.error('getDriverInfoById 调用失败：缺少 _id 参数。');
			return null; // 直接返回，避免无效的数据库查询
		}

		try {
			// 2. 使用 doc().get()：这是通过ID获取单个文档最高效、最直接的方式
			const res = await db_driver.doc(event._id).get();

			// 3. 返回单个对象：查询结果的 data 是一个包含单个文档的数组，直接返回该文档或null
			return res.data && res.data.length > 0 ? res.data : null;
		} catch (e) {
			// 4. 异常捕获：处理数据库查询可能发生的错误
			console.error(`getDriverInfoById 查询失败 (ID: ${event._id}):`, e);
			return null;
		}
	},

	/**
	 * [优化后] 获取车辆信息列表（支持分页、筛选和字段投影）
	 * @param {object} event - 包含查询条件的对象
	 * @param {object} [event.where] - 筛选条件，例如 { status: 1 }
	 * @param {object} [event.field] - 字段投影，指定返回哪些字段，例如 { license: 1, model: 1 }
	 * @param {number} [event.skip=0] - 分页跳过的条数
	 * @param {number} [event.limit=20] - 分页每页的条数
	 * @returns {object} 返回包含车辆列表和总数的结果对象 { data: [], total: 0 }
	 */
	async getCarInfoAll(event = {}) {
		// 1. 设置默认值，增加灵活性
		const {
			where = {},
				field = {},
				skip = 0,
				limit = 20 // 设置一个合理的默认分页大小，避免一次性返回过多数据
		} = event;

		try {
			// 2. 构建链式查询
			let query = db_car.where(where);

			// 3. 获取符合条件的总数（用于分页）
			const countResult = await query.count();
			const total = countResult.total;

			// 如果总数为0，则无需进行后续查询
			if (total === 0) {
				return {
					data: [],
					total: 0
				};
			}

			// 4. 应用分页和字段投影
			const res = await query
				.field(field)
				.skip(skip)
				.limit(limit)
				.get();

			// 5. 修正了必须使用 await 的问题，并返回标准结构
			return {
				data: res.data,
				total: total
			};
		} catch (e) {
			// 6. 异常捕获
			console.error('getCarInfoAll 查询失败:', e);
			return {
				data: [],
				total: 0,
				error: e.message
			};
		}
	}
	/**
	 * method1方法描述
	 * @param {string} param1 参数1描述
	 * @returns {object} 返回值描述
	 */
	/* 
	method1(param1) {
		// 参数校验，如无参数则不需要
		if (!param1) {
			return {
				errCode: 'PARAM_IS_NULL',
				errMsg: '参数不能为空'
			}
		}
		// 业务逻辑
		
		// 返回结果
		return {
			param1 //请根据实际需要返回值
		}
	}
	*/
}